﻿Imports WiremetModel.Entities.OEM
Imports InputValidation
Imports InputValidation.GeneralRules
Imports InputValidation.GeneralRules.NumericInputRules
Imports System.ComponentModel


Public Class NormaGatunekZakresWytrzymalosciInputDialog

    Private _unitOfWork As UnitOfWork
    Private _inputValidator As InputValidator
    Private _zakresyWytrzymalosci As IEnumerable(Of NormaGatunekZakresWytrzymalosci)

    Private _normaGatunekZakresWytrzymalosci As NormaGatunekZakresWytrzymalosci
    Public Property NormaGatunekZakresWytrzymalosci() As NormaGatunekZakresWytrzymalosci
        Get
            Return _normaGatunekZakresWytrzymalosci
        End Get
        Set(ByVal value As NormaGatunekZakresWytrzymalosci)
            _normaGatunekZakresWytrzymalosci = value
        End Set
    End Property




    Public Sub New(ByVal zakresyWytrzynalosci As IEnumerable(Of NormaGatunekZakresWytrzymalosci))
        InitializeComponent()
        _unitOfWork = New UnitOfWork()
        _normaGatunekZakresWytrzymalosci = New NormaGatunekZakresWytrzymalosci()
        _inputValidator = New InputValidator()
        ClearErrorLabels()
        _zakresyWytrzymalosci = zakresyWytrzynalosci
    End Sub

    Public Sub New(ByVal zakresyWytrzynalosci As IEnumerable(Of NormaGatunekZakresWytrzymalosci), ByVal normaGatunekZakresWytrzymalosci As NormaGatunekZakresWytrzymalosci)

        Me.New(zakresyWytrzynalosci)

        tb_SrednicaMinimalna.Text = normaGatunekZakresWytrzymalosci.SrednicaMinimalna.ToString()
        tb_SrednicaMaksymalna.Text = normaGatunekZakresWytrzymalosci.SrednicaMaksymalna.ToString()
        tb_WytrzymaloscMinimalna.Text = normaGatunekZakresWytrzymalosci.SrednicaMinimalna.ToString()
        tb_WytrzymaloscMinimalna.Text = normaGatunekZakresWytrzymalosci.SrednicaMaksymalna.ToString()

    End Sub

    Private Sub NormaGatunekZakresWytrzymalosciInputDialog_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles Me.FormClosed
        _unitOfWork.Dispose()
    End Sub

    Private Sub ClearErrorLabels()
        lbl_SrednicaMaksymalnaError.Text = String.Empty
        lbl_SrednicaMinimalnaError.Text = String.Empty
        lbl_WytrzymaloscMinimalnaError.Text = String.Empty
        lbl_WytrzymaloscMaksymalnaError.Text = String.Empty
    End Sub


#Region "Input validation"

    Private Sub tb_SrednicaMinimalna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_SrednicaMinimalna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        Dim numericPositiveInputValidatingSpecification As New NumericPositiveInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_SrednicaMinimalna, e, lbl_SrednicaMinimalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification))
    End Sub

    Private Sub tb_SrednicaMaksymalna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_SrednicaMaksymalna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        Dim numericPositiveInputValidatingSpecification As New NumericPositiveInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_SrednicaMinimalna, e, lbl_SrednicaMinimalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification))

        If Not e.Cancel Then
            Dim srednicaMaksymalnaValidatingSpecification As New SrednicaMaksymalnaValidatingSpecification(Decimal.Parse(tb_SrednicaMinimalna.Text.Trim()))
            _inputValidator.ValidateTextBox(tb_SrednicaMaksymalna, e, lbl_SrednicaMaksymalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification).And(srednicaMaksymalnaValidatingSpecification))
        End If
    End Sub

    Private Sub tb_WytrzymaloscMinimalna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_WytrzymaloscMinimalna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        Dim numericPositiveInputValidatingSpecification As New NumericPositiveInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_WytrzymaloscMinimalna, e, lbl_WytrzymaloscMinimalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification))
    End Sub

    Private Sub tb_WytrzymaloscMaksymalna_Validating(ByVal sender As Object, ByVal e As CancelEventArgs) Handles tb_WytrzymaloscMaksymalna.Validating
        Dim notNullableTextInputValidatingSpecification As New NotNullableTextInputValidatingSpecification()
        Dim numericInputValidatingSpecification As New NumericInputValidatingSpecification()
        Dim numericPositiveInputValidatingSpecification As New NumericPositiveInputValidatingSpecification()
        _inputValidator.ValidateTextBox(tb_WytrzymaloscMinimalna, e, lbl_WytrzymaloscMinimalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification))

        If Not e.Cancel Then
            Dim wytrzymaloscMaksymalnaValidatingSpecification As New WytrzymaloscMaksymalnaValidatingSpecification(Decimal.Parse(tb_WytrzymaloscMinimalna.Text.Trim()))
            _inputValidator.ValidateTextBox(tb_WytrzymaloscMaksymalna, e, lbl_WytrzymaloscMaksymalnaError, notNullableTextInputValidatingSpecification.And(numericInputValidatingSpecification).And(numericPositiveInputValidatingSpecification).And(wytrzymaloscMaksymalnaValidatingSpecification))
        End If
    End Sub

    Private Sub tb_SrednicaMinimalna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_SrednicaMinimalna.Validated
        lbl_SrednicaMinimalnaError.Text = String.Empty
    End Sub

    Private Sub tb_SrednicaMaksymalna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_SrednicaMaksymalna.Validated
        lbl_SrednicaMaksymalnaError.Text = String.Empty
    End Sub

    Private Sub tb_WytrzymaloscMinimalna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_WytrzymaloscMinimalna.Validated
        lbl_WytrzymaloscMinimalnaError.Text = String.Empty
    End Sub

    Private Sub tb_WytrzymaloscMaksymalna_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles tb_WytrzymaloscMaksymalna.Validated
        lbl_WytrzymaloscMaksymalnaError.Text = String.Empty
    End Sub


    Private Function GetCollidingZakres(ByVal min As Decimal, ByVal max As Decimal) As NormaGatunekZakresWytrzymalosci
        For Each zakresWytrzymalosci As NormaGatunekZakresWytrzymalosci In _zakresyWytrzymalosci
            If (NormaGatunekZakresWytrzymalosci.Id <> zakresWytrzymalosci.Id OrElse
                (NormaGatunekZakresWytrzymalosci.SrednicaMaksymalna <> zakresWytrzymalosci.SrednicaMaksymalna AndAlso NormaGatunekZakresWytrzymalosci.SrednicaMinimalna <> zakresWytrzymalosci.SrednicaMinimalna)) OrElse
                    (min >= zakresWytrzymalosci.SrednicaMinimalna AndAlso min < zakresWytrzymalosci.SrednicaMaksymalna) OrElse
                    (max > zakresWytrzymalosci.SrednicaMinimalna AndAlso max <= zakresWytrzymalosci.SrednicaMaksymalna) Then
                Return zakresWytrzymalosci
            End If
        Next
        Return Nothing
    End Function

#End Region

    Private Sub btn_Zatwierdź_Click(sender As System.Object, e As System.EventArgs) Handles btn_Accept.Click
        Try
            If Not ValidateChildren() Then
                Throw New EntityDataInputException("Podane dane są nieprawidłowe." & vbNewLine &
                                                   "Popraw je i spróbuj ponownie.")
            End If

            Dim collidingZakresWytrzymalosci As NormaGatunekZakresWytrzymalosci = GetCollidingZakres(Decimal.Parse(tb_SrednicaMinimalna.Text.Trim()), Decimal.Parse(tb_SrednicaMaksymalna.Text.Trim()))
            If Not IsNothing(collidingZakresWytrzymalosci) Then
                Throw New EntityDataInputException("Podany zarkes koliduje z innym zakresem:" & vbNewLine &
                                                   "Średnica minimalna: " & collidingZakresWytrzymalosci.SrednicaMinimalna & vbNewLine &
                                                   "Średnica maksymalna: " & collidingZakresWytrzymalosci.SrednicaMaksymalna)

            End If

            Dim confirmationDialogResult As DialogResult = MessageBox.Show("Czy jesteś pewień?", "Uwaga!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
            If confirmationDialogResult = Windows.Forms.DialogResult.Yes Then

                With NormaGatunekZakresWytrzymalosci
                    .SrednicaMaksymalna = Decimal.Parse(tb_SrednicaMaksymalna.Text.Trim())
                    .SrednicaMinimalna = Decimal.Parse(tb_SrednicaMinimalna.Text.Trim())
                    .WytrzymaloscMinimalna = Decimal.Parse(tb_WytrzymaloscMinimalna.Text.Trim())
                    .WytrzymaloscMaksymalna = Decimal.Parse(tb_WytrzymaloscMaksymalna.Text.Trim())
                End With

                DialogResult = Windows.Forms.DialogResult.OK
            End If
        Catch ex As EntityDataInputException
            MessageBox.Show(ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub btn_Anuluj_Click(sender As System.Object, e As System.EventArgs) Handles btn_Cancel.Click
        DialogResult = Windows.Forms.DialogResult.Cancel
    End Sub

End Class